package com.exam.practice;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @Author: xin.wang  E-mail:xin.wang1@myt11.com
 * @CreateTime: 2022/1/21 15:15
 * @Description: N天后的牢房
 */
public class EighthPractice {
    /**
     * 8间牢房排成一排，每间牢房不是有人住就是空着。每天，无论牢房是被占用或空置，都会根据以下规则进行更改：
     * 如果一间牢房的两个相邻的房间都被占用或都是空的，那么该牢房就会被占用。否则，它就会被空置。
     * （请注意，由于监狱中的牢房排成一行，所以行中的第一个和最后一个房间无法有两个相邻的房间。）
     * 我们用以下方式描述监狱的当前状态：如果第 i 间牢房被占用，则 cell[i]==1，否则 cell[i]==0。
     * 根据监狱的初始状态，在 N 天后返回监狱的状况（和上述 N 种变化）。
     * <p>
     * 示例 1：
     * 输入：cells = [0,1,0,1,1,0,0,1], N = 7
     * 输出：[0,0,1,1,0,0,0,0]
     * 解释：
     * 下表概述了监狱每天的状况：
     * Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
     * Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
     * Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
     * Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
     * Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
     * Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
     * Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
     * Day 7: [0, 0, 1, 1, 0, 0, 0, 0]
     *
     * @param args
     */
    public static void main(String[] args) {
        int[] cells = {0,1,0,1,1,0,0,1};
        System.out.println(Arrays.toString(processTwo(cells, 8)));
    }

    /**
     * 第二种解法
     * @param cells
     * @param n
     * @return
     */
    private static int[] processTwo(int[] cells,int n){
         int[][] changes = new int[n][cells.length];
         //初始化第一天
         changes[0] = cells;
         for(int i=0;i<n-1;i++){
             int tempLen = changes[i].length;
             int k= i+1;
             //第一间和最后一间没有相邻的房间，则肯定为0
             changes[k][0] = 0;
             changes[k][tempLen-1] =0;
             for(int j = 1;j<tempLen-1;j++){
                if(changes[i][j-1] == changes[i][j+1]){
                     changes[k][j] = 1;
                }else{
                    changes[k][j] =0;
                }
             }
           System.out.println(Arrays.toString(changes[i]));
         }
         return  changes[changes.length-1];
    }



    public static int[] prisonAfterNDays(int[] cells, int N) {
        ArrayList<int[]> list = new ArrayList<>();
        list.add(cells);
        int n = 1;//第一天
        while (n <= N) {
            int[] now = prisonStatus(list.get(n - 1));
            list.add(now);
            n++;
        }

        return list.get(list.size()-1);
    }

    /**
     * 根据前一天牢房的状态来获取当天的状态
     *
     * @param front
     * @return
     */
    private static int[] prisonStatus(int[] front) {
        int[] now = new int[front.length];
        now[0] = 0; //第一间牢房
        now[now.length - 1] = 0; //最后一间牢房
        for (int i = 1; i < front.length - 1; i++) {
            if (front[i - 1] == front[i + 1]) {
                now[i] = 1;
            } else {
                now[i] = 0;
            }
        }
        return now;
    }

}
